<?php

/**
 * Базовый класс валидаторов
 *
 */
abstract class Kernel_Validator_Abstract extends Kernel_Component {

    /**
     * Сообщение (или шаблон сообщения) об ошибке, которое бросает валидатор.
     * Если их больше, чем одно, можно как-нить переобозвать.
     *
     * @var string
     */
    public $message;

    /**
     * Сообщение об ошибке, возникшее в результате последней проверки.
     *
     * @var string
     */
    private $_message;

    /**
     * Проверяет правильность указанного значения
     *
     * @param   mixed   $value
     * @return  boolean
     */
    public function isValid($value) {
        // сбрасываем сообщение об ошибке
        $this->_message = null;
        try {
            $this->_validate($value);
        } catch (Kernel_Validator_Exception $e) {
            // сохраняем сообщение об ошибке
            $this->_message = $e->getMessage();
            return false;
        }
        return true;
    }

    /**
     * Возвращает сообщение об ошибке, возникшее в результате последней проверки.
     *
     * @return  mixed
     */
    public function getMessage() {
        return $this->_message;
    }

    /**
     * Регистрирует указанное сообщение об ошибке. Если не указано —
     * подставляет основное сообщение (для большинства валидаторов).
     *
     * @param   string  $message
     */
    protected function _error($message = null) {
        throw new Kernel_Validator_Exception(!is_null($message) ? $message : __($this->message));
    }

    /**
     * Проверяет правильность указанного значения
     *
     * @param   mixed   $value
     * @throws  Kernel_Validator_Exception
     */
    protected function _validate($value) {
        if (!$this->_isValid($value)) {
            $this->_error();
        }
    }

    /**
     * Проверяет правильность указанного значения
     *
     * @param   mixed   $value
     * @return  boolean
     */
    protected function _isValid($value) {
        trigger_error(get_class($this) . '::"_isValid() has to be implemented or _validate() overloaded', E_USER_ERROR);
    }
}
